<?php

declare(strict_types=1);

namespace app\model;

use think\model\concern\SoftDelete;
use app\model\common\BaseModel;
use app\model\common\HasPswdTrait;
use app\model\common\LoginCacheTrait;
use think\exception\ValidateException;

/**
 * 系统配置
 */
class SysConfig extends BaseModel
{
    public static $modelAlias = '系统配置';

    protected $table = 'sys_config';
    protected $pk = 'key';

    /** ---- 常量枚举 ---- */
    public const TYPE_MAP = [
        ['id' => 'string', 'name' => '文本'],
        ['id' => 'number', 'name' => '数字'],
        ['id' => 'json', 'name' => 'JSON'],
    ];

    /** ---- 获取/修改器 ---- */
    public function getTypeAttr()
    {
        $key = array_search($this['type_id'], array_column(static::TYPE_MAP, 'id'));
        if ($key === false) return null;
        return static::TYPE_MAP[$key];
    }
    public function setValueAttr($value, $data)
    {
        if ($this['type_id'] == 'string') {
            return $value;
        } else if ($this['type_id'] == 'number') {
            return $value;
        } else if ($this['type_id'] == 'json') {
            return json_encode($value, JSON_UNESCAPED_UNICODE);
        }
    }
    public function getValueAttr($value, $data)
    {
        if ($this['type_id'] == 'string') {
            return $value;
        } else if ($this['type_id'] == 'number') {
            $int = intval($value);
            $float = floatval($value);
            return $int == $float ? $int : $float;
        } else if ($this['type_id'] == 'json') {
            return json_decode($value, true);
        }
    }

    /** ---- 关联 ---- */

    /** ---- 查询范围 ---- */

    /** ---- 自定义方法 ---- */

    protected static $ConfigStore = null;
    /**
     * 获取配置项
     * 自带缓存
     * @param string|array|null $search 要获取的key，null获取全部，数组获取多个（允许['aa'=>'key']这样，'aa'是别名，会在返回结果中原样保留），字符串获取单个
     * @param boolean $returnModel 是否返回模型本身（false则返回值）
     */
    public static function getSysConfig($search = null, $returnModel = false)
    {
        if (is_null(static::$ConfigStore)) {
            $all = static::select();
            static::$ConfigStore = $all;
        }

        if (is_null($search)) {
            return static::$ConfigStore;
        } else if (is_array($search)) {
            $result = [];
            foreach ($search as $key => $value) {
                if (!is_string($value)) throw new ValidateException('$key如果是数组，其中每个元素的值必须是string');
                $result[$key] = static::getSysConfig($value, $returnModel);
            }
            return $result;
        } else if (is_string($search)) {
            foreach (static::$ConfigStore as $it) {
                if ($it['key'] == $search) return $returnModel ? $it : $it['value'];
            }
        }

        return null;
    }
}
